#include "log.h"  // 包含日志模块相关的宏定义和其他声明

// 获取当前时间戳并格式化为字符串
char* get_timestamp(char *buffer, size_t buffer_size) {
    time_t now = time(NULL);  // 获取当前时间
    // 使用 strftime 函数将时间转换为指定格式的字符串
    strftime(buffer, buffer_size, "%Y-%m-%d %H:%M:%S", localtime(&now));
    return buffer;
}

// 日志记录函数，负责格式化并输出日志信息到文件
void log_message(int level, const char *file, int line, const char *format, ...) {
    FILE *fp = fopen(LOG_FILE, "a");  // 打开日志文件，以追加模式（"a"）
    if (!fp) return;  // 如果文件打开失败，则直接返回，不记录任何日志

    // 准备日志条目的时间戳部分
    char timestamp[64];
    get_timestamp(timestamp, sizeof(timestamp));  // 调用 get_timestamp 函数获取时间戳

    // 写入日志头信息，包括时间戳、日志级别、文件名和行号
    fprintf(fp, "[%s] [%s] (%s:%d) ", 
            timestamp,
            (level == LOG_DEBUG) ? "DEBUG" :  // 根据日志级别选择合适的标签
            (level == LOG_INFO)  ? "INFO"  :
            (level == LOG_WARN)  ? "WARN"  : "ERROR",
            file, line);

    // 开始处理可变参数列表，用于格式化用户提供的消息
    va_list args;
    va_start(args, format);  // 初始化 va_list 用于访问后续的参数
    vfprintf(fp, format, args);  // 将格式化的消息写入文件
    va_end(args);  // 清理 va_list

    // 添加换行符并刷新缓冲区，确保所有数据都被写入磁盘
    fprintf(fp, "\n");
    fflush(fp);

    fclose(fp);  // 关闭文件指针，结束本次日志记录操作
}